//
//  main.m
//  Blokc的一些注意点
//
//  Created by hyl on 16/4/3.
//  Copyright © 2016年 hyl. All rights reserved.
//


#import <Foundation/Foundation.h>

int caculate(int(^caculate)(int,int),int a,int b)
{
    return caculate(a,b);
}

int main(int argc, const char * argv[]) {
//  可以发现两个NSLog(@"%p",&c);的值是不一样的
//  是值传递；不允许在block改变其值c=100;
    int c=20;
    __block int d=20;
//  如果加上__block就是传递指针，可以改变其值
    NSLog(@"%p",&c);
    typedef int (^caculateBlock) (int,int);//定义一种数据类型
    caculateBlock sumBlock=^(int value1,int value2){
        NSLog(@"%p",&c);
//        c=100;
        d=22;//想要允许改变其值，必需要加上__blokc
        NSLog(@"%i",d);
        return value1+value2;
    };
    //    sumBlock(10,20);
    //    NSLog(@"%i",sumBlock(10,20));
    
    
    //    当然block作为一种数据类型，当然就会数据类型的特性
    //    能定义变量，能作为参数，能作为返回值
    //    实际的应用场景中，后两者居多
    //    重写加减法, 代码在main外面
    //    caculate(sumBlock, 10,40);
//    NSLog(@"%i",caculate(^(int a,int b){return a+b;}, 10, 49));
    c=30;//不会改变block中值，说明是copy
    NSLog(@"%i",caculate(sumBlock, 10,40));
    
    //    作为返回值，如果有js代码经验的话，就是返回一个函数，执行的时候加个（）
    return 0;
}


